Freemarker allows JSP Taglibs to be used, by using the following declaration

<#assign display=JspTaglibs["/WEB-INF/display.tld"]/>

An example of rendering a table using display tag in Freemarker would be :-

<@display.table uid="user" name="allUsers" pagesize=500>
  <@display.column title="#">
     <#-- the row number variable exposed by display tag -->
     ${user_rowNum}
  </@display.column>
  <@display.column title="Name">
     <#-- assuming there's a getName() method in User object taht returns back java.lang.String -->
     ${user.name}
  </@display.column>
  <@display.column title="Last Login Time">
     <#-- assuming there's a getlastLoginTime in User object that returns back java.util.Date -->
     <@contextSetter contextKey="lastLoginTime" contextValue=user.lastLoginTime />
     <@ww.date name=r"%{#lastLoginTime}" nice="true" />
  </@display.column>
</@display.table>

A custom contextSetter Freemarker transform is being used to set the last login time from User object into WebWork's value stack's context, such that it could be latter retrieve from WebWork's tag.

The code for contextSetter Freemarker transform could be :-

public class ContextSetterTransform extends TagModel {

	private HttpServletRequest request; 
	private HttpServletResponse response;
	
	public ContextSetterTransform(OgnlValueStack stack, HttpServletRequest request, HttpServletResponse response) {
		super(stack, request, response);
		this.request = request;
		this.response = response;
	}
	
	@Override
	protected Component getBean() {
		return new ContextSetterBean(stack, request, response);
	}
}

Its WebWork backing component could be :-

public class ContextSetterBean extends Component {

	private String key; 
	private Object value;
	
	public ContextSetterBean(OgnlValueStack stack, HttpServletRequest request, HttpServletResponse response) {
		super(stack);
	}
	
	public String getContextKey() { return key; }
	public void setContextKey(String key) { this.key = key; }
	
	public Object getContextValue() { return value; }
	public void setContextValue(Object value) { this.value = value; }

	@SuppressWarnings("unchecked")
	@Override
	public boolean end(Writer writer, String body) {
		getStack().getContext().put(key, value);
		return false; // body do not need to be re-evaluated again.
	}
}

To be able to use this transform, we need to extends WebWork's FreemarkerManager as follows :-

public class CustomFreemarkerManager extends FreemarkerManager {
  ...
  @Override
  public SimpleHash buildTemplateModel(OgnlValueStack stack, Object action, ServletContext servletContext,   
                                       HttpServletRequest request, HttpServletResponse response, 
                                       ObjectWrapper objectWrapper) {
       SimpleHash hash = super.buildTemplateModel(stack, action, servletContext, 
                                                  request, response, objectWrapper);
       hash.put("contextSetter", new ContextSetterTransform(stack, request, response));
       return has;
  }
  ...
}

and registered the customized FreemarkerManager in webwork.properties

webwork.freemarker.manager.classname=foo.bar.CustomFreemarkerManager

References

[1] - Information about WebWork and Freemarker integration here
[2] - Information about various configurables in webwork.properties here